<?php
/**
 * #Celebrate Shieh
 *             ,%%%%%%%%,
 *           ,%%/\%%%%/\%%
 *          ,%%%\c "" J/%%%
 * %.       %%%%/ o  o \%%%
 * `%%.     %%%%    _  |%%%
 *  `%%     `%%%%(__Y__)%%'
 *  //       ;%%%%`\-/%%%'
 * ((       /  `%%%%%%%'
 *  \\    .'          |
 *   \\  /       \  | |
 *    \\/         ) | |
 *     \         /_ | |__
 *     (___________))))))) 攻城湿
 *
 *        _       _
 * __   _(_)_   _(_) __ _ _ __
 * \ \ / / \ \ / / |/ _` |'_ \
 *  \ V /| |\ V /| | (_| | | | |
 *   \_/ |_| \_/ |_|\__,_|_| |_|
 */
namespace App\Libs\System;

class SystemInfoWindows
{

    /**
     * 判断指定路径下指定文件是否存在，如不存在则创建
     *
     * @param string $fileName 文件名
     * @param string $content  文件内容
     *
     * @return string 返回文件路径
     */
    private function getFilePath( $fileName, $content )
    {
        $path = dirname(__FILE__) . "\\$fileName";
        if ( ! file_exists($path) ) {
            file_put_contents($path, $content);
        }
        return $path;
    }

    /**
     * 获得cpu使用率vbs文件生成函数
     *
     * @return string 返回vbs文件路径
     */
    private function getCupUsageVbsPath()
    {
        return $this->getFilePath(
            'cpu_usage.vbs',
            "On Error Resume Next
    Set objProc = GetObject(\"winmgmts:\\\\.\\root\cimv2:win32_processor='cpu0'\")
    WScript.Echo(objProc.LoadPercentage)"
        );
    }

    /**
     * 获得总内存及可用物理内存JSON vbs文件生成函数
     *
     * @return string 返回vbs文件路径
     */
    private function getMemoryUsageVbsPath()
    {
        return $this->getFilePath(
            'memory_usage.vbs',
            "On Error Resume Next
    Set objWMI = GetObject(\"winmgmts:\\\\.\\root\cimv2\")
    Set colOS = objWMI.InstancesOf(\"Win32_OperatingSystem\")
    For Each objOS in colOS
     Wscript.Echo(\"{\"\"TotalVisibleMemorySize\"\":\" & objOS.TotalVisibleMemorySize & \",\"\"FreePhysicalMemory\"\":\" & objOS.FreePhysicalMemory & \"}\")
    Next"
        );
    }

    /**
     * 获得CPU使用率
     *
     * @return Number
     */
    public function getCpuUsage()
    {
        $path = $this->getCupUsageVbsPath();
        exec("cscript -nologo $path", $usage);
        return $usage[ 0 ];
    }

    /**
     * 获得内存使用率数组
     *
     * @return array
     */
    public function getMemoryUsage()
    {
        $path = $this->getMemoryUsageVbsPath();
        exec("cscript -nologo $path", $usage);
        $memory            = json_decode($usage[ 0 ], TRUE);
        $memory[ 'usage' ] = Round(( ( $memory[ 'TotalVisibleMemorySize' ] - $memory[ 'FreePhysicalMemory' ] ) / $memory[ 'TotalVisibleMemorySize' ] ) * 100);
        return $memory;
    }

    /**
     * 已运行时长
     *
     * @return string
     */
    public function getTimeUsage()
    {
        exec('wmic os get lastBootUpTime,LocalDateTime', $out, $status);
        $datetime_array = explode('.', $out[ 1 ]);
        $localtime      = substr($datetime_array[ 1 ], -14);
        $uptime         = strtotime($localtime) - strtotime($datetime_array[ 0 ]);
        return "已运行: " . secToTime($uptime, 'd');
    }

}
